package com.xuan.meihua.core;

import lombok.Data;

import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
 * 梅花易数设置
 *
 * @author kty
 */
@Data
public class MeiHuaSetting {

    /**
     * 性别（0:女，1:男）
     */
    private int sex;

    /**
     * 姓名
     */
    private String name;

    /**
     * 测事
     */
    private String occupy;

    /**
     * 地区
     */
    private String address;

    /**
     * 日期
     */
    private Date date;

    /**
     * 日期类型（0:公历，1:农历）
     */
    private int dateType;

    /**
     * 起卦模式（0:时间。1:数字。2:单数。3:双数）
     */
    private int qiGuaMode;

    /**
     * 起卦数（起卦模式为[数字]时生效，三位数）
     */
    private int qiGuaNumber;

    /**
     * 起卦数（起卦模式为[单数]时生效）
     */
    private int qiGuaDanNumber;

    /**
     * 起卦数（起卦模式为[双数]时生效）
     */
    private List<Integer> qiGuaShuangNumber;

    /**
     * 双数计算上下卦（0:双数求和计算上下卦。1:双数不求和计算上下卦）
     */
    private int qiGuaShuangNumberInSx;

    /**
     * 双数计算动爻（0:双数求和计算动爻。1:双数求和加时数计算动爻）
     */
    private int qiGuaShuangNumberInDong;

    /**
     * 年柱（0:以正月初一作为新年的开始，1:以立春当天作为新年的开始，2:以立春交接的时刻作为新年的开始）
     */
    private int yearZhuSet;

    /**
     * 月柱（0:以节交接当天起算，1：以节交接时刻起算）
     */
    private int monthZhuSet;

    /**
     * 日柱（0:晚子时日柱算当天，1:晚子时日柱算明天）
     */
    private int dayZhuSet;

    /**
     * 时柱（0:支持早子时和晚子时）
     */
    private int hourZhuSet;

//---------------------------------------------------------------------------------------------------------------

    /**
     * 初始化设置
     */
    public MeiHuaSetting() {

        this.sex = MeiHuaEnum.SEX_MAN.getMark(); // 性别（默认→ 男）
        this.name = null; // 姓名（默认→ 空）
        this.occupy = null; // 占事（默认→ 空）
        this.address = null; // 地区（默认→ 空）
        this.date = new Date(); // 日期（默认→ 当前时刻）
        this.dateType = MeiHuaEnum.DATE_TYPE_SOLAR.getMark(); // 日期类型（默认→ 公历）
        this.qiGuaMode = MeiHuaEnum.QI_GUA_MODE_SHI_JIAN.getMark(); // 起卦模式（默认→ 时间）
        this.qiGuaNumber = 111; // 起卦数，起卦模式为[数字]时生效（默认→ 111）
        this.qiGuaDanNumber = 111; // 起卦数，起卦模式为[单数]时生效（默认→ 111）
        this.qiGuaShuangNumber = Arrays.asList(111, 111); // 起卦数，起卦模式为[单数]时生效（默认→ [111, 111]）
        this.qiGuaShuangNumberInSx = MeiHuaEnum.QI_GUA_MODE_IN_NO_HE_TO_SX.getMark(); // 双数计算上下卦（默认→ 双数不求和计算上下卦）
        this.qiGuaShuangNumberInDong = MeiHuaEnum.QI_GUA_MODE_IN_HE_TO_DONG.getMark(); // 双数计算上下卦（默认→ 双数求和计算动爻）
        this.yearZhuSet = MeiHuaEnum.YEAR_ZHU_SET_LICHUN_DAY.getMark(); // 年柱（默认→ 以立春当天作为新年的开始）
        this.monthZhuSet = MeiHuaEnum.MONTH_ZHU_SET_SHIKE.getMark(); // 月柱（默认→ 以节交接时刻起算）
        this.dayZhuSet = MeiHuaEnum.DAY_ZHU_SET_TODAY.getMark(); // 日柱（默认→ 晚子时日柱算当天）
        this.hourZhuSet = MeiHuaEnum.HOUR_ZHU_SET.getMark(); // 时柱（默认→ 支持早子时和晚子时）

    }

    /**
     * 设置起卦数
     *
     * @param qiGuaNumber 起卦数
     */
    public void setQiGuaNumber(int qiGuaNumber) {

        String number = String.valueOf(qiGuaNumber);

        // 当数字小于3位时则设置默认值
        if (number.length() < 3) {
            number = String.valueOf(111);
//            System.err.println("---> 起卦数已设置为默认值（111）");
        }

        // 当数字大于3位以上则截取前三位
        if (number.length() > 3) {
            number = number.substring(0, 3);
//            System.err.println("---> 起卦数已默认为前三位数（" + number + "）");
        }

        // 获取上卦数、下卦数、动爻数
        int shangGuaNumber = Integer.parseInt(String.valueOf(number.charAt(0))); // 上卦数
        int xiaGuaNumber = Integer.parseInt(String.valueOf(number.charAt(1))); // 下卦数
        int dongYaoNumber = Integer.parseInt(String.valueOf(number.charAt(2))); // 动爻数

        // 上卦数最小为1，最大为8
        if (shangGuaNumber <= 0 || shangGuaNumber > 8) {
            shangGuaNumber = 8;
        }
        // 下卦数最小为1，最大为8
        if (xiaGuaNumber <= 0 || xiaGuaNumber > 8) {
            xiaGuaNumber = 8;
        }
        // 动爻数最小为1，最大为6
        if (dongYaoNumber <= 0 || dongYaoNumber > 6) {
            dongYaoNumber = 6;
        }

        this.qiGuaNumber = Integer.parseInt("" + shangGuaNumber + xiaGuaNumber + dongYaoNumber);

    }


}
